﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TI_EntityLib;
using TiPort.TiEntityObjects;
using MongoDB;
using TI_EntityLib.TiEntityObjects;
using System.IO;
using System.Collections;
using System.Threading;
using Helper;
using TiEntityObject.Transport;

namespace TI
{
   public class FastFileLoader 
    {
        public static List<TransportFile> FileList = null;
        
        /// <summary>
        /// Спсок транспортов касающхся процедур по контракту
        /// </summary>
        public static List<TransportFile> ContractProcedureList = null;
        
        public static TransportConfig config = null;
        public static bool bNext = true;
        public static int TheardCount = 1;
        
       
        static FastFileLoader()
        {
            FileList = new List<TransportFile>();
        }

        /// <summary>
        /// Сформировать список обработки
        /// Запустить файл на обработку
        /// Нет файлов выключае процесс 
        /// </summary>
        public static void Processed()
        {
            ////кончились файлы для обработки 
            //if (FileList.Count == 0)
            //{
            //    bNext = false;
            //    Thread.Sleep(1000);
            //    Console.WriteLine("NEXT DATA PACK");
            //    RUN();
            //    return;
            //}
            //TransportFile f = null;
            //lock (FileList)
            //{
            //    f = FileList[0];
            //    //убираем из карусельки
            //    FileList.RemoveAt(0);
            //    Console.WriteLine(FileList.Count.ToString());
            //    Console.WriteLine(f.FileName);
                
            //}
            ////обработка 
            //SaveToDb(f);
        }

        public static void SaveToDb(TransportFile transportFile, DateTime transportDay)
        {
            exportBase l = null;
            try
            {
                //формируем транспортный файл               
                transportFile.Load();

                //получаем коллекцию объектов 
                l = transportFile.GetEntityList(transportDay);

                //не получили коллекцию левый файл 
                if (null == l)
                {
                    Helper.FileTools.RenameFile(transportFile.FileName, transportFile.FileName.Replace(".xml", ".empty"));
                    //Log.CurrentFolder.AddEmptyFile(transportFile.FileName);
                    return;
                }
            }
            catch (Exception e) // ошибки серилизации
            {
                Helper.FileTools.RenameFile(transportFile.FileName, transportFile.FileName.Replace(".xml", ".ERR_SER"));
                //Log.CurrentFolder.AddErrFile(transportFile.FileName);
               // throw e;
            }

         
            string script = string.Empty;
            string currrentID = string.Empty;
           // mongo.Connect();
            ICollection  lst = l.GetCollection();
              
               foreach (IDbRootObject i in lst)
               {
                   try
                   {
                       if (i.Class != TiEntityClass.Pharm)// грузим только фармацевтику
                                    continue;

                       currrentID = i.Key ;
                       Console.WriteLine(transportFile.FileName + " " + currrentID );
                       script = i.GetInsertScript();
                       MongoTools t = new MongoTools();
                       t.ExecuteScript(script);                      
                   }
                   catch (Exception e)
                   {
                       Console.WriteLine(e.Message);                      
                       SaveErrFile(script, currrentID);
                       System.Threading.Thread.Sleep(30000);   
                       //Log.CurrentFolder.AddErrFile(transportFile.FileName);
                       continue;
                   }
               }
               Helper.FileTools.RenameFile(transportFile.FileName, transportFile.FileName.Replace(".xml", ".OK"));
               //Log.CurrentFolder.AddOkFile(transportFile.FileName);
            }

        public static void SaveErrFile(string ErrScript, string FileName)
        {

            StreamWriter sr = File.CreateText(config.ErrXmlFolder+ FileName);
            sr.WriteLine(ErrScript);
            sr.Close();


        }

        public static void UnzipFolder(string folderZip)
        {
            string[] a = Helper.FileTools.GetFileList(folderZip, "*.zip");
                       foreach (string i in a)
                       {
                           try
                           {
                               Helper.FileTools.Decompress(i, folderZip);
                               Helper.FileTools.RenameFile(i, i.Replace(".zip", ".zp_"));
                               Console.WriteLine(i + ":DecompressOK");
                               //Log.CurrentFolder.AddZipFile(i);
                               
                           }
                           catch 
                           {
                               Console.WriteLine(i + ":DecompressERR");
                               FileInfo inf=new FileInfo (i);
                               File.Move(i, FastFileLoader.config.ErrZipFolder + inf.Name);
                               continue;
                           }
                       }

        }
    
        public static void PopulateFileList()
        {
            string[] a;
            //собираем из папок 
            string[] d = Directory.GetDirectories(config.FtpRoot);
            foreach (string f in d)
            {
                UnzipFolder(f);
                a = Helper.FileTools.GetFileList(f, config.FtpFileMask);
                foreach (string i in a)
                {
                    FileList.Add(new TransportFile(i,f));
                }
            }
            FileList.Sort(TransportFile.Comparer);
        }

        public static  string CurrentFolder="";
        
        public static void RUN()
        {
            do
            {
                Console.WriteLine("--------------------------------------" + DateTime.Now.ToLongTimeString() + "----------------------");
                //Log = TransportLog.GetTransportLog(config.ReportFolder);
                string[] a;
                //собираем данные из папок 
                string[] d = Directory.GetDirectories(config.FtpRoot);
                foreach (string f in d)
                {
                    //формируем лог для папки 
                    //Log.AddFolder(f);

                    UnzipFolder(f);

                    //если в папке есть нужные нам файлы 
                    if (FolderHaveData(f))
                    {
                        a = Helper.FileTools.GetFileList(f, config.FtpFileMask);
                        foreach (string i in a)
                        {
                            FileList.Add(new TransportFile(i, f));
                            //Log.CurrentFolder.AddFile(i);
                        }
                        
                        FileList.Sort(TransportFile.Comparer);
                        
                        CurrentFolder=f;
                        
                        //обрабатываем содержимое папки 
                        foreach (TransportFile i in FileList)
                        {
                            //обработка 
                            //SaveToDb(i);
                        }
                        FileList.Clear();
                    }
                    //Log.Save(config.ReportFolder);

                }
                Console.WriteLine("Waiting...."); 
                Thread.Sleep(900000);   

            } while (true);
        }
       
        public static void RUN_()
        {
            string[] a;
            //собираем данные из папок 
            string[] d = Directory.GetDirectories(config.FtpRoot);
            foreach (string f in d)
            {
                //формируем лог для папки 
                //Log.AddFolder(f);

                UnzipFolder(f);

                //если в папке есть нужные нам файлы 
                if (FolderHaveData(f))
                {
                    a = Helper.FileTools.GetFileList(f, config.FtpFileMask);
                    foreach (string i in a)
                    {
                        FileList.Add(new TransportFile(i, f));
                       // Log.CurrentFolder.AddFile(i);
                    }
                    FileList.Sort(TransportFile.Comparer);

                }
            }
          

        }

        /// <summary>
        /// Нитка обработки 
        /// </summary>
        public static void TheardGo()
        {
            do
            {
                FastFileLoader.Processed();

            } while (FastFileLoader.bNext);
        }

        /// <summary>
        /// Проверить папку на наличие файлов для обработки
        /// </summary>
        /// <returns></returns>
        public static bool FolderHaveData(string f)
        {
          string[]  a = Helper.FileTools.GetFileList(f, config.FtpFileMask);
          return a.Length > 0;
        }
    }
      
  
}
